﻿using System;
using System.IO;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Recomendaciones.Entidades;
using Recomendaciones.AccesoADatos;

//Agregado 1-12. Se agregaró la biblioteca IO, la funcion MovePhoto, las constantes que están unos renglones abajo y se modificó el actualizar e insertar.

/// <summary>
/// Descripción breve de PeliculaServices
/// </summary>
public class PeliculaServices
{
    Ado _ado;
    private const string _photoDirectory = @"\Imagenes\Peliculas\";
    private const string _photoDirectoryTemp = @"\Imagenes\temp\";
    private const string _defaultPhoto = @"Pelicula-default.jpg";

    #region Constructor y Destructor
    public PeliculaServices()
	{
	    _ado = new Ado();
	}

    ~PeliculaServices()
    {
        _ado = null;
    }
    #endregion

    private string MovePhoto(string photo)
    {
        try
        {
            //throw new Exception("ProbandoMovePhoto");
            var sourceFilePath = AppDomain.CurrentDomain.BaseDirectory + _photoDirectoryTemp + Path.GetFileName(photo);
            var destFilePathShort = _photoDirectory + Path.GetFileName(photo);
            var count = 1;

            while (File.Exists(AppDomain.CurrentDomain.BaseDirectory + destFilePathShort))
            {
                destFilePathShort = _photoDirectory + Path.GetFileNameWithoutExtension(photo) + "(" + count++ + ")" + Path.GetExtension(photo);
            }
            File.Move(sourceFilePath, AppDomain.CurrentDomain.BaseDirectory + destFilePathShort);
            return destFilePathShort.Replace('\\', '/');
        }
        catch {
            return null;    
        }
    }

    public List<Pelicula> ObtenerTopTen()
    {
        try {
        _ado.EjecutarStoredProcedureDataReader("Pelicula_ObtenerTopTen");
        DataTable peliculas = _ado.DevolverDatosRapido();
        return (List<Pelicula>)CollectionHelper.ConvertTo<Pelicula>(peliculas);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public Pelicula ObtenerPorId(string id)
    {
        try{
        ArrayList parametros = new ArrayList(1);
        parametros.Add(Convert.ToInt32(id));
        _ado.EjecutarStoredProcedureDataReader("Pelicula_ObtenerPorId",parametros);
        DataTable peliculas = _ado.DevolverDatosRapido();

        //Solo devolvemos el primer elemento del list porque al buscar por id obtendremos un solo resultado//
        return ((List<Pelicula>)CollectionHelper.ConvertTo<Pelicula>(peliculas))[0];
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string InsertarPelicula(string genero_id, string usuario_id, string titulo, string anio, string resumen, string origen, string duracion, string clasificacion, string imagen, string directores, string actores)
    {
        try
        {
            if (String.IsNullOrEmpty(titulo) || titulo.Length > 60 || !esAlfanumerico(titulo))
                return "Titulo invalido";
            if (String.IsNullOrEmpty(anio) || anio.Length != 4 || !esNumero(anio))
                return "Año invalido";
            if (String.IsNullOrEmpty(duracion) || duracion.Length > 3 || !esNumero(duracion))
                return "Duracion invalido";
            if (String.IsNullOrEmpty(resumen) || resumen.Length > 1000 || !esAlfanumerico(resumen))
                return "Resumen invalido";
            if (String.IsNullOrEmpty(directores) || directores.Length > 60 || !esAlfanumerico(directores))
                return "Directores invalido";
            if (String.IsNullOrEmpty(actores) || actores.Length > 250 || !esAlfanumerico(actores))
                return "Actores invalido";
            if (String.IsNullOrEmpty(origen) || !esNumero(origen))
                return "Origen invalido";
            if (String.IsNullOrEmpty(clasificacion) || !esNumero(clasificacion))
                return "Clasificacion invalida";
            if (String.IsNullOrEmpty(genero_id) || !esNumero(genero_id))
                return "Genero invalido";
            if (String.IsNullOrEmpty(usuario_id) || !esNumero(usuario_id))
                return "Usuario invalido";

            //throw new Exception("ProbandoInsertarPelicula");
            string pathImagenTemp = Path.GetDirectoryName(imagen);
            if (pathImagenTemp + "\\" == _photoDirectoryTemp)
            {
                imagen = this.MovePhoto(imagen);
            }

            ArrayList parametros = new ArrayList(11);
            parametros.Add(Convert.ToInt32(genero_id));
            parametros.Add(Convert.ToInt32(usuario_id));
            parametros.Add(titulo);
            parametros.Add(Convert.ToInt32(anio));
            parametros.Add(resumen);
            parametros.Add(Convert.ToInt32(origen));
            parametros.Add(Convert.ToInt32(duracion));
            parametros.Add(Convert.ToInt32(clasificacion));
            parametros.Add(imagen);
            parametros.Add(directores);
            parametros.Add(actores);

            /*
            var photo = AppDomain.CurrentDomain.BaseDirectory + imagen.Replace('/', '\\');
            string pathImagen = Path.GetFileName(imagen);
            if (pathImagen != _defaultPhoto && File.Exists(photo))
            {
                File.Delete(photo);
            }
            */
            _ado.EjecutarStoredProcedureDataReader("Pelicula_Insertar", parametros);

            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string ActualizarPelicula(string pelicula_id, string genero_id, string usuario_id, string titulo, string anio, string resumen, string origen, string duracion, string clasificacion, string imagen, string directores, string actores)
    {
        try {

            if (String.IsNullOrEmpty(titulo) || titulo.Length > 60 || !esAlfanumerico(titulo))
                return "Titulo invalido";
            if (String.IsNullOrEmpty(anio) || anio.Length != 4 || !esNumero(anio))
                return "Año invalido";
            if (String.IsNullOrEmpty(duracion) || duracion.Length > 3 || !esNumero(duracion))
                return "Duracion invalido";
            if (String.IsNullOrEmpty(resumen) || resumen.Length > 1000 || !esAlfanumerico(resumen))
                return "Resumen invalido";
            if (String.IsNullOrEmpty(directores) || directores.Length > 60 || !esAlfanumerico(directores))
                return "Directores invalido";
            if (String.IsNullOrEmpty(actores) || actores.Length > 250 || !esAlfanumerico(actores))
                return "Actores invalido";
            if (String.IsNullOrEmpty(origen) || !esNumero(origen))
                return "Origen invalido";
            if (String.IsNullOrEmpty(clasificacion) || !esNumero(clasificacion))
                return "Clasificacion invalida";
            if (String.IsNullOrEmpty(genero_id) || !esNumero(genero_id))
                return "Genero invalido";
            if (String.IsNullOrEmpty(usuario_id) || !esNumero(usuario_id))
                return "Usuario invalido";
            if (String.IsNullOrEmpty(pelicula_id) || !esNumero(pelicula_id))
                return "Pelicula invalida";

            string pathImagenTemp = Path.GetDirectoryName(imagen);
            if (pathImagenTemp + "\\" == _photoDirectoryTemp)
            {
                imagen = this.MovePhoto(imagen);
            }

            ArrayList parametros = new ArrayList(12);
            parametros.Add(Convert.ToInt32(pelicula_id));
            parametros.Add(Convert.ToInt32(genero_id));
            parametros.Add(Convert.ToInt32(usuario_id));
            parametros.Add(titulo);
            parametros.Add(Convert.ToInt32(anio));
            parametros.Add(resumen);
            parametros.Add(Convert.ToInt32(origen));
            parametros.Add(Convert.ToInt32(duracion));
            parametros.Add(Convert.ToInt32(clasificacion));
            parametros.Add(imagen);
            parametros.Add(directores);
            parametros.Add(actores);

            /*
            var photo = AppDomain.CurrentDomain.BaseDirectory + imagen.Replace('/', '\\');
            string pathImagen = Path.GetFileName(imagen);
            if (pathImagen != _defaultPhoto && File.Exists(photo))
            {
                File.Delete(photo);
            }
            */

            _ado.EjecutarStoredProcedureDataReader("Pelicula_Actualizar", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public string EliminarPelicula(string id)
    {
        try
        {
            ArrayList parametros = new ArrayList(1);
            parametros.Add(Convert.ToInt32(id));
            _ado.EjecutarStoredProcedureDataReader("Pelicula_EliminarPorId", parametros);
            return _ado.DevolverRegistro();
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public List<GeneroPelicula> ObtenerGeneros()
    {
        try {
            _ado.EjecutarStoredProcedureDataReader("Pelicula_ObtenerGeneros");
            DataTable generos = _ado.DevolverDatosRapido();

            return (List<GeneroPelicula>)CollectionHelper.ConvertTo<GeneroPelicula>(generos);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    public List<ClasificacionPelicula> ObtenerClasificaciones()
    {
        try
        {
            _ado.EjecutarStoredProcedureDataReader("Pelicula_ObtenerClasificaciones");
            DataTable clasificaciones = _ado.DevolverDatosRapido();

            return (List<ClasificacionPelicula>)CollectionHelper.ConvertTo<ClasificacionPelicula>(clasificaciones);
        }
        catch (Exception ex)
        {
            LogErrorServices logErrorService = new LogErrorServices();
            logErrorService.InsertarLogError(ex.GetType().ToString(), ex.StackTrace, ex.Message, ex.GetBaseException().ToString(), ex.Source);
            return null;
        }
    }

    #region Validaciones

    private bool esAlfanumerico(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[\\w.,: áéíóúÁÉÍÓÚñÑ]*$");
        return regExobj.IsMatch(cadena);
    }

    private bool esNumero(string cadena)
    {
        System.Text.RegularExpressions.Regex regExobj = new System.Text.RegularExpressions.Regex("^[0-9]*$");
        return regExobj.IsMatch(cadena);
    }

    #endregion
    
}
